package cn.biplam.front.html.base;

import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.front.html.base.Const.Align_Type;
import cn.biplam.front.html.base.Const.Border_Style;
import cn.biplam.front.html.base.Const.Border_Width;
import cn.biplam.front.html.base.Const.Clear_Type;
import cn.biplam.front.html.base.Const.Cursor_Type;
import cn.biplam.front.html.base.Const.Display_Mode;
import cn.biplam.front.html.base.Const.Float_Type;
import cn.biplam.front.html.base.Const.Font_Family;
import cn.biplam.front.html.base.Const.Font_Weight;
import cn.biplam.front.html.base.Const.Length_Unit;
import cn.biplam.front.html.base.Const.Position_Mode;
import cn.biplam.front.html.base.Const.Repeat_Type;
import cn.biplam.front.html.base.Const.Text_Decoration;
import cn.biplam.front.html.base.Const.VAlign_Type;
import cn.biplam.front.html.base.Const.Visibility_Mode;


/**
 * Html可显示对象基础类(负责定义显示所需要的页面参数)<BR>
 * 		HtmlWindow类不保存任何属性信息,仅负责转发给HtmlContainer(因为写标签属性和绑定命令的公共draw()方法在HtmlContainer实现)
 * 		所有继承自HtmlWindow的类,都要实现copy方法,以便支持深度复制,在copy方法中调用super._copy(HtmlWindow)复制父类中的容器
 * @author 	WangSong
 * @create 	2009-3-31 上午11:26:54
 * @version 1.0
 */
public abstract class HtmlWindow extends HtmlContainer {

	/**
	 * 构造方法 无参构造
	 */
	public HtmlWindow(){}

	/**
	 * 构造方法  传入对象的页面ID初始化
	 * @param ID
	 */
	public HtmlWindow(String ID){
		super(ID);
	}

	/**
	 * 构造方法 传入对象的页面ID和CSSID初始化
	 * @param ID
	 * @param cssID
	 */
	public HtmlWindow(String ID,String cssID){
		super(ID,cssID);
	}
	
	/**
	 * 复制HtmlWindow对象内容(供实现类copy方法使用)
	 * @param html
	 * @throws ErrorMessage
	 */
	protected void _copy(HtmlWindow html) throws ErrorMessage{
		html.setProperty(this.getPropertySet());
		html.setStyle(this.getStyleSet());
		html.putAllBinds(this.getBindset());
		html.setEventBind(this.getEventBindSet());
		html.putAllElements(this.getAllElements());
		html.setLength(this.getLength());
	}
	
	/**
	 * 复制自己创建一个新实例并转型为HtmlWindow
	 * @return	创建好的新实例
	 * @throws ErrorMessage 
	 */
	public abstract HtmlWindow copy() throws ErrorMessage;
	
	/**
	 * 设置对象内容的对齐方式
	 * @param type	Const.Align_Type
	 * @throws ErrorMessage 
	 */
	public void setAlign(Align_Type type) throws ErrorMessage{
		super.setProperty("align", type.toString());
	}
	
	/**
	 * 设置对象文字内容的对齐方式
	 * @param type	Const.Align_Type
	 * @throws ErrorMessage 
	 */
	public void setTextAlign(Align_Type type) throws ErrorMessage{
		super.setStyle("text-align", type.toString());
	}

	/**
	 * 设置对象背景颜色值
	 * @param value		颜色值(为空表示透明色)
	 * @throws ErrorMessage 
	 */
	public void setBackGroundColor(String color) throws ErrorMessage{
		super.setStyle("background-color", color);
	}

	/**
	 * 设置对象背景图像
	 * @param url		图像URL
	 * @throws ErrorMessage 
	 */
	public void setBackGroundImage(String url) throws ErrorMessage{
		super.setStyle("background-image", "url("+url+")");
	}

	/**
	 * 设置对象背景图像平铺类型
	 * @param type		背景平铺类型 Repeat_Type
	 * @throws ErrorMessage 
	 */
	public void setBackGroundRepeat(Repeat_Type repeatType) throws ErrorMessage{
		super.setStyle("background-repeat", repeatType.toString());
	}

	/**
	 * 设置边框(设置值直接转换为border:之后的值)
	 * @param value	边框设置值(例如 1px solid blue)
	 * @throws ErrorMessage 
	 */
	public void setBorder(String width,Border_Style style,String color) throws ErrorMessage{
		super.setStyle("border", width+"px "+style.toString()+" "+color);
	}
	
	/**
	 * 设置边框颜色
	 * @param color		边框颜色值
	 * @throws ErrorMessage 
	 */
	public void setBorderColor(String color) throws ErrorMessage{
		super.setStyle("border-color", color);
	}

	/**
	 * 设置边框样式
	 * @param style		边框样式(Const.Border_Style)
	 * @throws ErrorMessage 
	 */
	public void setBorderStyle(Border_Style style) throws ErrorMessage{
		super.setStyle("border-style", style.toString());
	}

	/**
	 * 设置边框宽度
	 * @param width 边框宽度(Const.Border_Width)
	 * @throws ErrorMessage 
	 */
	public void setBorderWidth(Border_Width width) throws ErrorMessage{
		super.setStyle("border-width", width.toString());
	}
	
	/**
	 * 设置边框宽度
	 * @param width 边框宽度
	 * @throws ErrorMessage 
	 */
	public void setBorderWidth(String width) throws ErrorMessage{
		super.setStyle("border-width", width);
	}

	/**
	 * 设置浮动对象的换行方式
	 * @param type	{@link Const}.Clear_Type
	 * @throws ErrorMessage
	 */
	public void setClear(Clear_Type type) throws ErrorMessage{
		super.setStyle("clear", type.toString());
	}

	/**
	 * 设置鼠标指针类型
	 * @param cursor	Const.Cursor_Type
	 * @throws ErrorMessage 
	 */
	public void setCursor(Cursor_Type cursor) throws ErrorMessage{
		super.setStyle("cursor", cursor.toString());
	}
	
	/**
	 * 设置对象的浮动方式
	 * @param type	{@link Const}.Float_Type
	 * @throws ErrorMessage
	 */
	public void setFloat(Float_Type type) throws ErrorMessage{
		super.setStyle("float", type.toString());
	}

	/**
	 * 设置对象字体颜色
	 * @param color
	 * @throws ErrorMessage 
	 */
	public void setFontColor(String color) throws ErrorMessage{
		super.setStyle("color", color);
	}

	/**
	 * 设置字体名称
	 * @param family	字体名称(Const.Font_Family)
	 * @throws ErrorMessage 
	 */
	public void setFontFamily(Font_Family family) throws ErrorMessage{
		super.setStyle("font-family", family.toString());
	}

	
	/**
	 * 设置字体大小
	 * @param size		字体大小值(默认单位px)
	 * @throws ErrorMessage 
	 */
	public void setFontSize(String size) throws ErrorMessage{
		super.setStyle("font-size", size+Length_Unit.px.toString());
	}

	/**
	 * 设置字体大小
	 * @param size		字体大小值(默认单位)
	 * @param unit		字体大小单位(Const.Length_Unit)
	 * @throws ErrorMessage 
	 */
	public void setFontSize(String size,Length_Unit unit) throws ErrorMessage{
		super.setStyle("font-size", size+unit.toString());
	}

	/**
	 * 设置对象中的文本字体的粗细
	 * @param weight
	 * @throws ErrorMessage
	 */
	public void setFontWeight(Font_Weight weight) throws ErrorMessage{
		super.setStyle("font-weight", weight.toString());
	}

	/**
	 * 设置对象显示宽度
	 * @uses setHeight(String)
	 * @throws ErrorMessage 
	 */
	public void setHeight(String value) throws ErrorMessage {
		super.setProperty("height", value+Length_Unit.px.toString());
	}

	/**
	 * 设置对象显示宽度
	 * @uses setHeight(String,Const.Length_Unit)
	 * @param value
	 * @param unit
	 * @throws ErrorMessage 
	 */
	public void setHeight(String value,Length_Unit unit) throws ErrorMessage{
		super.setProperty("height", value+unit.toString());
	}

	/**
	 * @throws ErrorMessage 
	 * 设置对象左上角相对父窗口左边界的距离
	 * @uses setLeft(String)
	 */
	public void setLeft(String value) throws ErrorMessage {
		super.setStyle("left", value+Length_Unit.px.toString());
	}

	/**
	 * 设置对象左上角相对父窗口左边界的距离
	 * @uses setLeft(String,Const.Length_Unit)
	 * @param value
	 * @param unit
	 * @throws ErrorMessage 
	 */
	public void setLeft(String value,Length_Unit unit) throws ErrorMessage{
		super.setStyle("left", value+unit.toString());
	}

	/**
	 * @throws ErrorMessage 
	 * 设置对象右下角相对父窗口底部的距离
	 * @uses setBottom(String)
	 */
	public void setBottom(String value) throws ErrorMessage {
		super.setStyle("bottom", value+Length_Unit.px.toString());
	}

	/**
	 * 设置对象右下角相对父窗口底部的距离
	 * @uses setBottom(String,Const.Length_Unit)
	 * @param value
	 * @param unit
	 * @throws ErrorMessage 
	 */
	public void setBottom(String value,Length_Unit unit) throws ErrorMessage{
		super.setStyle("bottom", value+unit.toString());
	}

	/**
	 * 设置对象行高
	 * @param value
	 * @throws ErrorMessage 
	 */
	public void setLineHeight(String value) throws ErrorMessage{
		super.setStyle("line-height", value+Length_Unit.px);
	}
	
	/**
	 * 设置外延边距
	 * @param value
	 * @throws ErrorMessage
	 */
	public void setMargin(String value) throws ErrorMessage{
		super.setStyle("margin", value);
	}
	
	/**
	 * 设置外延边距
	 * @param value
	 * @throws ErrorMessage
	 */
	public void setMarginBottom(String value) throws ErrorMessage{
		super.setStyle("margin-bottom", value);
	}

	/**
	 * 设置外延边距
	 * @param value
	 * @throws ErrorMessage
	 */
	public void setMarginLeft(String value) throws ErrorMessage{
		super.setStyle("margin-left", value);
	}
	
	/**
	 * 设置外延边距
	 * @param value
	 * @throws ErrorMessage
	 */
	public void setMarginRight(String value) throws ErrorMessage{
		super.setStyle("margin-right", value);
	}
	
	/**
	 * 设置外延边距
	 * @param value
	 * @throws ErrorMessage
	 */
	public void setMarginTop(String value) throws ErrorMessage{
		super.setStyle("margin-top", value);
	}

	/**
	 * 设置内部留白
	 * @param value
	 * @throws ErrorMessage
	 */
	public void setPadding(String value) throws ErrorMessage{
		super.setStyle("padding", value);
	}
	
	/**
	 * 设置内部留白
	 * @param value
	 * @throws ErrorMessage
	 */
	public void setPaddingBottom(String value) throws ErrorMessage{
		super.setStyle("padding-bottom", value);
	}

	/**
	 * 设置内部留白
	 * @param value
	 * @throws ErrorMessage
	 */
	public void setPaddingLeft(String value) throws ErrorMessage{
		super.setStyle("padding-left", value);
	}
	
	/**
	 * 设置内部留白
	 * @param value
	 * @throws ErrorMessage
	 */
	public void setPaddingRight(String value) throws ErrorMessage{
		super.setStyle("padding-right", value);
	}
	
	/**
	 * 设置内部留白
	 * @param value
	 * @throws ErrorMessage
	 */
	public void setPaddingTop(String value) throws ErrorMessage{
		super.setStyle("padding-top", value);
	}

	/**
	 * 设置对象的定位方式
	 * @param mode
	 * @throws ErrorMessage 
	 */
	public void setPositionMode(Position_Mode mode) throws ErrorMessage {
		super.setStyle("position", mode.toString());
	}
	
	/**
	 * 设置对象显示大小(页面属性方式)
	 * @uses setHeight(String)
	 * @throws ErrorMessage 
	 */
	public void setSize(String width,String height) throws ErrorMessage {
		this.setWidth(width);
		this.setHeight(height);
	}

	/**
	 * 设置对象显示宽度(样式表方式)
	 * @throws ErrorMessage 
	 */
	public void setStyleHeight(String value) throws ErrorMessage {
		super.setStyle("height", value+Length_Unit.px.toString());
	}
	
	/**
	 * 设置对象显示宽度(样式表方式)
	 * @throws ErrorMessage 
	 */
	public void setStyleHeight(int value) throws ErrorMessage {
		super.setStyle("height", value+Length_Unit.px.toString());
	}
	
	/**
	 * 设置对象显示宽度(样式表方式)
	 * @param value
	 * @param unit
	 * @throws ErrorMessage 
	 */
	public void setStyleHeight(String value,Length_Unit unit) throws ErrorMessage{
		super.setStyle("height", value+unit.toString());
	}
	
	/**
	 * 设置对象显示大小(样式表方式)
	 * @throws ErrorMessage 
	 */
	public void setStyleSize(String width,String height) throws ErrorMessage {
		this.setStyleWidth(width);
		this.setStyleHeight(height);
	}
	
	/**
	 * 设置对象显示大小(样式表方式)
	 * @throws ErrorMessage 
	 */
	public void setStyleSize(int width,int height) throws ErrorMessage {
		this.setStyleWidth(String.valueOf(width));
		this.setStyleHeight(String.valueOf(height));
	}
	
	/**
	 * 设置对象显示宽度(样式表方式)
	 * @throws ErrorMessage 
	 */
	public void setStyleWidth(String value) throws ErrorMessage {
		super.setStyle("width", value+Length_Unit.px.toString());
	}
	
	/**
	 * 设置对象显示宽度(样式表方式)
	 * @throws ErrorMessage 
	 */
	public void setStyleWidth(int value) throws ErrorMessage {
		super.setStyle("width", value+Length_Unit.px.toString());
	}
	
	/**
	 * 设置对象显示宽度(样式表方式)
	 * @param value
	 * @param unit
	 * @throws ErrorMessage 
	 */
	public void setStyleWidth(String value,Length_Unit unit) throws ErrorMessage{
		super.setStyle("width", value+unit.toString());
	}

	/**
	 * 设置对象中的文本的装饰
	 * @param type
	 * @throws ErrorMessage 
	 */
	public void setTextDecoration(Text_Decoration type) throws ErrorMessage{
		super.setStyle("text-decoration", type.toString());
	}

	/**
	 * 设置对象左上角相对父窗口顶部的距离(该属性受PositionMode属性影响)
	 * @see #setPositionMode #setTop
	 * @param value	长度
	 * @throws ErrorMessage 
	 */
	public void setTop(String value) throws ErrorMessage{
		super.setStyle("top", value+Length_Unit.px.toString());
	}
	
	/**
	 * 设置对象左上角相对父窗口顶部的距离(该属性受PositionMode属性影响)
	 * @param value	长度
	 * @param unit		长度单位
	 * @throws ErrorMessage 
	 */
	public void setTop(String value,Length_Unit unit) throws ErrorMessage{
		super.setStyle("top", value+unit.toString());
	}
	
	/**
	 * 设置对象右上角相对父窗口右边界的距离(该属性受PositionMode属性影响)
	 * @see setPositionMode  #setTop(int,Length_Unit)
	 * @param value	长度
	 * @throws ErrorMessage 
	 */
	public void setRight(String value) throws ErrorMessage{
		super.setStyle("right", value+Length_Unit.px.toString());
	}
	
	/**
	 * 设置对象右上角相对父窗口右边界的距离(该属性受PositionMode属性影响)
	 * @param value	长度
	 * @param unit		长度单位
	 * @throws ErrorMessage 
	 */
	public void setRight(String value,Length_Unit unit) throws ErrorMessage{
		super.setStyle("right", value+unit.toString());
	}
	
	/**
	 * 设置对象的纵向对齐方式
	 * @param type	{@link Const}.VAlign_Type
	 * @throws ErrorMessage
	 */
	public void setVAlign(VAlign_Type type) throws ErrorMessage{
		super.setProperty("valign", type.toString());
	}
	
	/**
	 * 设置对象显示模式
	 * @param mode		{@link Const}.Visibility_Mode
	 * @throws ErrorMessage
	 */
	public void setVisibility(Visibility_Mode mode) throws ErrorMessage{
		super.setStyle("visibility", mode.toString());
	}
	
	/**
	 * 设置对象是否显示及及如何显示
	 * @param mode 显示模式 {@link Const}.Display_Mode
	 * @throws ErrorMessage
	 */
	public void setDisplay(Display_Mode mode) throws ErrorMessage{
		super.setStyle("display", mode.toString());
	}
	
	/**
	 * 设置对象的状态 (true有效,false 无效)
	 * @param disabled  对象状态
	 * @throws ErrorMessage
	 */
	public void setDisabled(boolean disabled) throws ErrorMessage{
		if(disabled){
			super.setProperty("disabled", String.valueOf(disabled));
		}
	}
	
	/**
	 * 设置对象的是否只读 (true只读,false 非只读)
	 * @param readOnly  是否只读
	 * @throws ErrorMessage
	 */
	public void setReadOnly(boolean readOnly) throws ErrorMessage{
		super.setProperty("readonly", String.valueOf(readOnly));
	}
	
	/**
	 * 设置对象显示宽度
	 * @throws ErrorMessage 
	 */
	public void setWidth(String value) throws ErrorMessage {
		super.setProperty("width", value+Length_Unit.px.toString());
	}
	
	/**
	 * 设置对象显示宽度
	 * @param value
	 * @param unit
	 * @throws ErrorMessage 
	 */
	public void setWidth(String value,Length_Unit unit) throws ErrorMessage{
		super.setProperty("width", value+unit.toString());
	}
	
	/**
	 * 设置布局层次(仅适用于绝对定位)
	 * @throws ErrorMessage
	 */
	public void setZIndex(String value) throws ErrorMessage{
		super.setStyle("z-index", value);
	}


}
